#1. 添加cmake版本说明
cmake_minimum_required(VERSION 3.1.3)
#2. 声明工程名称
project(odb-test)

#3. 检测并生成ODB框架代码
# 3.1 配置 ODB 源文件路径与待处理文件列表
# - odb_path：ODB 映射头文件（.hxx）所在目录（当前工程的 entity 子目录）
# - odb_files：需生成映射代码的头文件（可添加多个，如 "student.hxx teacher.hxx"）
set(odb_path ${CMAKE_CURRENT_SOURCE_DIR}/entity)
set(odb_files student.hxx)

# 3.2 初始化变量，用于存储生成的 ODB 文件信息
set(odb_hxx "")
set(odb_cxx "")
set(odb_srcs "")

# 3.3 循环处理每个 ODB 源文件，实现"按需生成"逻辑
foreach(odb_file ${odb_files})
# 3.3.1 生成目标文件名：将源文件后缀 .hxx 替换为 ODB 标准后缀
    #        例：student.hxx → student-odb.hxx（头文件）、student-odb.cxx（源文件）
    string(REPLACE ".hxx" "-odb.hxx" odb_hxx ${odb_file})
    string(REPLACE ".hxx" "-odb.cxx" odb_cxx ${odb_file})
    if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx})
        add_custom_command(
            PRE_BUILD  # 执行时机：在目标文件编译前触发
            COMMAND odb  # 调用 ODB 工具
            ARGS -d mysql --std c++11 --generate-query --generate-schema --profile boost/date-time ${odb_path}/${odb_file}
            DEPENDS ${odb_path}/${odb_file}  # 依赖：若源文件（student.hxx）修改，重新生成
            OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx}  # 输出文件：生成的 ODB 源文件
            COMMENT "生成 ODB 框架代码文件: ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx}"  # 构建日志提示
        )
    endif()

    # 3.3.3 收集生成的 ODB 源文件，加入源码列表（无论是否重新生成，确保编译时能找到）
    list(APPEND odb_srcs ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx})
endforeach()

# 4. 【源码收集】获取项目主源码目录下的所有 .cpp/.c 文件
#    - aux_source_directory：自动递归收集指定目录（source 子目录）的所有源码文件
#    - src_files：存储收集到的主源码文件（如 main.cpp、db_ops.cpp 等）
set(src_files "")
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/source src_files)

# 5. 【目标定义】声明可执行文件目标 "main"
#    - 目标名称：main（最终生成的可执行文件名）
#    - 依赖源码：主源码文件（src_files） + ODB 生成的源码文件（odb_srcs）
add_executable(main ${src_files} ${odb_srcs})

# 6. 【头文件路径】配置编译器头文件搜索路径（避免 #include 时写绝对路径）
#    - 第一个路径：主项目的 entity 目录（存放自定义头文件，如 student.hxx）
#    - 第二个路径：构建目录（存放 ODB 生成的头文件，如 student-odb.hxx）
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/entity
    ${CMAKE_CURRENT_BINARY_DIR}
)

# 7. 【链接配置】指定可执行文件需要链接的第三方库
target_link_libraries(main -lodb-mysql -lodb -lodb-boost -lgflags)

# 8. 【安装配置】指定可执行文件的安装路径
#    - TARGETS main：指定安装的目标为 "main" 可执行文件
#    - RUNTIME DESTINATION bin：将可执行文件安装到系统的 bin 目录（如 /usr/local/bin）
#    - 安装命令：在构建目录执行 make install 即可触发
INSTALL(TARGETS main RUNTIME DESTINATION bin)